.\" Copyright (c) 2019 Gao Xiang <xiang@kernel.org>
.\"
.TH MKFS.EROFS 1
.SH NAME
mkfs.erofs \- tool to create an EROFS filesystem
.SH SYNOPSIS
\fBmkfs.erofs\fR [\fIOPTIONS\fR] \fIDESTINATION\fR \fISOURCE\fR
.SH DESCRIPTION
EROFS is a new enhanced lightweight linux read-only filesystem with modern
designs (eg. no buffer head, reduced metadata, inline xattrs/data, etc.) for
scenarios which need high-performance read-only requirements, e.g. Android OS
for smartphones and LIVECDs.
.PP
It also provides fixed-sized output compression support, which improves storage
density, keeps relatively higher compression ratios, which is more useful to
achieve high performance for embedded devices with limited memory since it has
unnoticable memory overhead and page cache thrashing.
.PP
mkfs.erofs is used to create such EROFS filesystem \fIDESTINATION\fR image file
from \fISOURCE\fR directory or tarball.
.SH OPTIONS
.TP
.BI "\-z " compression-algorithm \fR[\fP, # \fR][\fP: ... \fR]\fP
Set a primary algorithm for data compression, which can be set with an
optional compression level. Alternative algorithms could be specified
and separated by colons.  See the output of
.B mkfs.erofs \-\-help
for a listing of the algorithms that \fBmkfs.erofs\fR is compiled with
and what their respective level ranges are.
.TP
.BI "\-b " block-size
Set the fundamental block size of the filesystem in bytes.  In other words,
specify the smallest amount of data that can be accessed at a time.  The
default is the system page size.  It cannot be less than 512 bytes.
.TP
.BI "\-C " max-pcluster-size
Specify the maximum size of compress physical cluster in bytes.
This may cause the big pcluster feature to be enabled (Linux v5.13+).
.TP
.BI "\-d " #
Specify the level of debugging messages. The default is 2, which shows basic
warning messages.
.TP
.BI "\-x " #
Limit how many xattrs will be inlined. The default is 2.
Disables storing xattrs if < 0.
.TP
.BI "\-E " [^]extended-option \fR[\fP, ... \fR]\fP
Set extended options for the filesystem. Extended options are comma separated,
and may take an extra argument using the equals ('=') sign.  To disable a
feature, usually prefix the extended option name with a caret ('^') character.
The following extended options are supported:
.RS 1.2i
.TP
.BI all-fragments
Forcely record the whole files into a special inode for better compression and
it may take an argument as the pcluster size of the packed inode in bytes.
(Linux v6.1+)
.TP
.BI dedupe
Enable global compressed data deduplication to minimize duplicated data in
the filesystem. May further reduce image size when used with
.BR -E\ fragments .
(Linux v6.1+)
.TP
.BI force-inode-compact
Force generation of compact (32-byte) inodes.
.TP
.BI force-inode-extended
Force generation of extended (64-byte) inodes.
.TP
.BI force-inode-blockmap
Force generation of inode chunk format as a 4-byte block address array.
.TP
.BI force-chunk-indexes
Forcely generate inode chunk format as an 8-byte chunk index (with device ID).
.TP
.BI [^]fragdedupe\fR[\fP= <inode|full> \fR]\fP
Set the mode for fragment data deduplication.  It's effective only when
\fI-E(all)-fragments\fP is used together.  If a caret ('^') character is set,
fragment data deduplication is disabled.
.RS 1.2i
.TP
.I inode
Deduplicate fragment data only when the inode data is identical.  This option
will result in faster image generation with the current codebase
.TP
.I full
Always deduplicate fragment data if possible
.RE
.TP
.BI fragments\fR[\fP= size \fR]\fP
Pack the tail part (pcluster) of compressed files, or entire files, into a
special inode for smaller image sizes, and it may take an argument as the
pcluster size of the packed inode in bytes. (Linux v6.1+)
.TP
.BI ^inline_data
Don't inline regular files.  It's typically useful to enable FSDAX (Linux 5.15+)
for those images, however, there could be other use cases too.
.TP
.BI legacy-compress
Disable "inplace decompression" and "compacted indexes",
for compatibility with Linux pre-v5.4.
.TP
.B xattr-name-filter
Enable a name filter for extended attributes to optimize negative lookups.
(Linux v6.6+).
.TP
.BI ztailpacking
Pack the tail part (pcluster) of compressed files into its metadata to save
more space and the tail part I/O. (Linux v5.17+)
.RE
.TP
.BI "\-L " volume-label
Set the volume label for the filesystem to
.IR volume-label .
The maximum length of the volume label is 15 bytes.
.TP
.BI "\-T " #
Specify a UNIX timestamp for image creation time for reproducible builds.
If \fI--mkfs-time\fR is not specified, it will behave as \fI--all-time\fR:
setting all files to the specified UNIX timestamp instead of using the
modification times of the source files.
.TP
.BI "\-U " UUID
Set the universally unique identifier (UUID) of the filesystem to
.IR UUID .
The format of the UUID is a series of hex digits separated by hyphens,
like this: "c1b9d5a2-f162-11cf-9ece-0020afc76f16".
The
.I UUID
parameter may also be one of the following:
.RS 1.2i
.TP
.I clear
clear the file system UUID
.TP
.I random
generate a new randomly-generated UUID
.RE
.TP
.B \-\-all-root
Make all files owned by root.
.TP
.B \-\-all-time
(used together with \fB-T\fR) set all files to the fixed timestamp. This is the
default.
.TP
.BI "\-\-blobdev " file
Specify an extra blob device to store chunk-based data.
.TP
.BI "\-\-chunksize " #
Generate chunk-based files with #-byte chunks.
.TP
.BI "\-\-compress-hints " file
Apply a per-file compression strategy. Each line in
.I file
is defined by
tokens separated by spaces in the following form.  Optionally, instead of
the given primary algorithm, alternative algorithms can be specified with
\fIalgorithm-index\fR explicitly:
.RS 1.2i
<pcluster-size-in-bytes> [algorithm-index] <match-pattern>
.RE
.IR match-pattern s
are extended regular expressions, matched against absolute paths within
the output filesystem, with no leading /.
.TP
.BI "\-\-dsunit=" #
Align all data block addresses to multiples of #.
.TP
.BI "\-\-exclude-path=" path
Ignore file that matches the exact literal path.
You may give multiple
.B --exclude-path
options.
.TP
.BI "\-\-exclude-regex=" regex
Ignore files that match the given extended regular expression.
You may give multiple
.B --exclude-regex
options.
.TP
.BI "\-\-file-contexts=" file
Read SELinux label configuration/overrides from \fIfile\fR in the
.BR selinux_file (5)
format.
.TP
.BI "\-\-force-uid=" UID
Set all file UIDs to \fIUID\fR.
.TP
.BI "\-\-force-gid=" GID
Set all file GIDs to \fIGID\fR.
.TP
.BI "\-\-fsalignblks=" #
Specify the alignment of the primary device size (usually the filesystem size)
in blocks.
.TP
.BI "\-\-gid-offset=" GIDOFFSET
Add \fIGIDOFFSET\fR to all file GIDs.
When this option is used together with
.BR --force-gid ,
the final file gids are
set to \fIGID\fR + \fIGID-OFFSET\fR.
.TP
\fB\-V\fR, \fB\-\-version\fR
Print the version number and exit.
.TP
\fB\-h\fR, \fB\-\-help\fR
Display help string and exit.
.TP
.B "\-\-ignore-mtime"
Ignore the file modification time whenever it would cause \fBmkfs.erofs\fR to
use extended inodes over compact inodes. When not using a fixed timestamp, this
can reduce total metadata size. Implied by
.BR "-E force-inode-compact" .
.TP
.BI "\-\-max-extent-bytes " #
Specify maximum decompressed extent size in bytes.
.TP
.B \-\-mkfs-time
(used together with \fB-T\fR) the given timestamp is only applied to the build
time.
.TP
.B "\-\-preserve-mtime"
Use extended inodes instead of compact inodes if the file modification time
would overflow compact inodes. This is the default. Overrides
.BR --ignore-mtime .
.TP
.BI "\-\-sort=" MODE
Inode data sorting order for tarballs as input.

\fIMODE\fR may be one of \fBnone\fR or \fBpath\fR.

\fBnone\fR: No particular data order is specified for the target image to
avoid unnecessary overhead; Currently, it takes effect if `-E^inline_data` is
specified and no compression is applied.

\fBpath\fR: Data order strictly follows the tree generation order. (default)
.TP
.BI "\-\-tar, \-\-tar=" MODE
Treat \fISOURCE\fR as a tarball or tarball-like "headerball" rather than as a
directory.

\fIMODE\fR may be one of \fBf\fR, \fBi\fR, or \fBheaderball\fR.

\fBf\fR: Generate a full EROFS image from a regular tarball. (default)

\fBi\fR: Generate a meta-only EROFS image from a regular tarball. Only
metadata such as dentries, inodes, and xattrs will be added to the image,
without file data. Uses for such images include as a layer in an overlay
filesystem with other data-only layers.

\fBheaderball\fR: Generate a meta-only EROFS image from a stream identical
to a tarball except that file data is not present after each file header.
It can improve performance especially when \fISOURCE\fR is not seekable.
.TP
.BI "\-\-uid-offset=" UIDOFFSET
Add \fIUIDOFFSET\fR to all file UIDs.
When this option is used together with
.BR --force-uid ,
the final file uids are
set to \fIUID\fR + \fIUIDOFFSET\fR.
.TP
.BI \-\-ungzip\fR[\fP= file \fR]\fP
Filter tarball streams through gzip. Optionally, raw streams can be dumped
together.
.TP
.BI \-\-unxz\fR[\fP= file \fR]\fP
Filter tarball streams through xz, lzma, or lzip. Optionally, raw streams can
be dumped together.
.TP
.BI "\-\-vmdk-desc=" FILE
Generate a VMDK descriptor file to merge sub-filesystems, which can be used
for tar index or rebuild mode.
.TP
.BI "\-\-xattr-prefix=" PREFIX
Specify a customized extended attribute namespace prefix for space saving,
e.g. "trusted.overlay.".  You may give multiple
.B --xattr-prefix
options (Linux v6.4+).
.SH AUTHOR
This version of \fBmkfs.erofs\fR is written by Li Guifu <blucerlee@gmail.com>,
Miao Xie <miaoxie@huawei.com> and Gao Xiang <xiang@kernel.org> with
continuously improvements from others.
.PP
This manual page was written by Gao Xiang <xiang@kernel.org>.
.SH AVAILABILITY
\fBmkfs.erofs\fR is part of erofs-utils package and is available from
git://git.kernel.org/pub/scm/linux/kernel/git/xiang/erofs-utils.git.
.SH SEE ALSO
.BR mkfs (8).
